package main

import "time"

// 无缓冲区 channel：用作信号传递
// 1对1通知信号

type signal struct{}

func work() {
	println("worker is working...")
	time.Sleep(1 * time.Second)
}

func spawn(f func()) <-chan signal {
	ch := make(chan signal)

	go func() {
		println("worker start to work...")
		f()
		ch <- signal{} // 结束任务后向 channel 发送值，作为信号通知另一方
	}()

	return ch // 立即将刚创建的 channel 返回给调用者
}

func main() {
	println("start a worker...")

	ch := spawn(work) // spawn 返回的 channel 被用于承载 子goroutine 退出的“通知信号”

	<-ch // main goroutine 在调用 spawn 后，将会一直阻塞在对“通知信号”的接收动作上

	println("worker work done")
}
